package controller;

import entity.Adesione;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import sbForEntityClasses.AdesioneFacadeLocal;
import sbForEntityClasses.ArticoloFacadeLocal;
import sbForEntityClasses.SitoAcquistiFacadeLocal;
import entity.Annuncio;
import entity.Articolo;
import entity.SitoAcquisti;
import entity.UtenteRegistrato;
import java.util.GregorianCalendar;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.Query;
import sbForEntityClasses.AnnuncioFacadeLocal;
import utilities.QueryBuilder;

/**
 * Metodi generici per la gestione degli annunci
 * @author ale
 */
@Stateless
public class ControllerAnnunci implements ControllerAnnunciLocal {

    @EJB
    private AnnuncioFacadeLocal annuncioFacade;
    @EJB
    private ArticoloFacadeLocal articoloFacade;
    @EJB
    private AdesioneFacadeLocal adesioneFacade;
    @EJB
    private SitoAcquistiFacadeLocal sitoAcquistiFacade;
    @PersistenceContext(unitName = "ShippingShareBisBis-ejbPU")
    private EntityManager em;

    /**
     * Restituisce il numero totale di annunci presenti nel sistema
     * @return il numero totale di annunci presenti nel sistema
     */
    @Override
    public int numeroAnnunci() {
        return annuncioFacade.count();
    }

    /**
     * Restituisce la lista di tutti gli annunci presenti nel sistema
     * @return la lista di tutti gli annunci presenti nel sistema
     */
    @Override
    public java.util.List<Annuncio> tuttiGliAnnunci() {
        return annuncioFacade.findAll();
    }

    /**
     * Recupera l'adesione di un utente a un certo annuncio
     * @param utenteLoggato utente di cui recuperare l'adesione
     * @param idAnnuncio id dell'annuncio di cui recuperare l'adesione
     * @return l'adesione se l'utente è iscritto all'annuncio, null altrimenti
     */
    @Override
    public Adesione getAdesione(UtenteRegistrato utenteLoggato, Long idAnnuncio) {
        return adesioneFacade.getAdesione(utenteLoggato.getId(), idAnnuncio);
    }

    /**
     * Recupera un'adesione a partire dal suo id
     * @param idAdesione id dell'adesione cercata
     * @return l'adesione corrispondente, null se non esiste un'adesione con tale id
     */
    @Override
    public Adesione getAdesione(long idAdesione) {
        return adesioneFacade.find(idAdesione);
    }

    /**
     * Recupera un annuncio a partire dal suo id
     * @param idAnnuncio id dell'annuncio cercato
     * @return l'annuncio corrispondete, null se non esiste un annuncio con tale id
     */
    @Override
    public Annuncio getAnnuncio(long idAnnuncio) {
        return annuncioFacade.find(idAnnuncio);
    }

    /**
     * Restituisce un sito a partire  dal suo url
     * @param urlSito url cercato
     * @return il sito corrispondente, se esiste; null altrimenti
     */
    @Override
    public SitoAcquisti getSito(String urlSito) {
        SitoAcquisti sito = null;
        if (urlSito == null) {
            return null;
        }
        for (SitoAcquisti s : sitoAcquistiFacade.findAll()) {
            if (s.getUrl().contains(urlSito)) {
                sito = s;
            }
        }
        return sito;
    }

    /**
     * Persistenza
     * @param object
     */
    public void persist(Object object) {
        em.persist(object);
    }

    /**
     * Recupera un articolo a partire dal suo id
     * @param idArticolo id dell'articolo cercato
     * @return l'articolo cercato, se esiste; null altrimenti
     */
    @Override
    public Articolo getArticolo(long idArticolo) {
        return articoloFacade.find(idArticolo);
    }

    /**
     * Recupera la lista di tutti gli annunci che scadono oggi
     * @return la lista di tutti gli annunci che scadono oggi
     */
    @Override
    public List<Annuncio> annunciChiusi() {
        QueryBuilder qb = new QueryBuilder("Annuncio", em);

        qb.addWhereEqNumClause("dataChiusura", new GregorianCalendar());

        Query q = qb.getQueryObject();
        return q.getResultList();
    }
    
}
